﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;

namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test_ServiciosAdicionales
    {
        private IServiciosAdicionales adminServicioAdicional = null;
        int codigoGenerado = 0;
        Servicios objServicios;
        SalaEnsayo objSalaEnsayo;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            Local objLocal;

            LocalDAO adoLocal;
            ServiciosDAO adoServicios;
            SalaEnsayoDAO daoSalaEnsayo;

            daoSalaEnsayo = new SalaEnsayoDAO();
            adoServicios = new ServiciosDAO();
            adoLocal = new LocalDAO();

            adminServicioAdicional = new ServiciosAdicionalesDAO();
            //foreach (Cliente cliente in adminCliente.ListarTodos())
            //    adminCliente.Eliminar(cliente);
            //Creamos clientes para tenerlos disponibles en las pruebas
            //adminCliente.Crear(new Cliente() { Apellidos = "Romero", Nombres = "César", CodigoDocumento = 1, NumeroDocumento = 12345, Email = "cromero@contraloria.gob.pe", FechaNacimiento = Convert.ToDateTime("30-06-1987"), ClaveAcceso = "pantera", Direccion = "Av. Las Begonias 526", CodigoDistrito = 1, Estado = true });

            objLocal = adoLocal.Obtener(1);
            objSalaEnsayo = daoSalaEnsayo.Crear(new SalaEnsayo() { NombreSala = "Sala 1", Local = objLocal, Capacidad = 3, Caracteristicas = "Comentarios", Comentarios = "Ninguno", Disponibilidad = true, Estado = true });

            objServicios = adoServicios.Obtener(1);
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminServicioAdicional);
            Assert.IsNotNull(objServicios);
            Assert.IsNotNull(objSalaEnsayo);
            //se instancia a la entidad a crear
            ServiciosAdicionales objAdicional = new ServiciosAdicionales();
            objAdicional.Servicios = objServicios;
            objAdicional.SalaEnsayo = objSalaEnsayo;
            objAdicional.Observacion = "prueba de test Servicios adicionales";
            objAdicional.Estado = true;

            //se declara la entidad que se retornara
            ServiciosAdicionales adicionalRetornado = null;
            //no aseguramos que no retorne una exepcion
            //Assert.DoesNotThrow(delegate
            //{
                adicionalRetornado = adminServicioAdicional.Crear(objAdicional);
                codigoGenerado = adicionalRetornado.CodigoServicioAdicional;
            //});
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(adicionalRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }

        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminServicioAdicional);
            // 2. Declaramos e instanciamos la entidad de dominio
            ServiciosAdicionales objAdicional = adminServicioAdicional.Obtener(codigoGenerado);
            objAdicional.Servicios = objServicios;
            objAdicional.SalaEnsayo = objSalaEnsayo;
            objAdicional.Observacion = "prueba de test servicios adicionales";
            objAdicional.Estado = true;
            // 3. Declaramos la entidad que contendrá el resultado
            ServiciosAdicionales adicionalModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adicionalModificado = adminServicioAdicional.Modificar(objAdicional);
            }, "servicio modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(adicionalModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(adicionalModificado.CodigoServicioAdicional, codigoGenerado);
            // Probamos que la observacion registrado es igual al solicitado con la entidad
            Assert.AreEqual(adicionalModificado.Observacion, adicionalModificado.Observacion);
        }

        [Test]
        public void Test3_Eliminar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminServicioAdicional);
            // 2. Definimos la entidad que contendrá el resultado
            ServiciosAdicionales adicionalExistente = adminServicioAdicional.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminServicioAdicional.Eliminar(adicionalExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminServicioAdicional.Obtener(codigoGenerado));
        }

        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }

    }
}
